package cn.lpq.one_qrcode_pay.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * 主键的生成器
 * 
 * @author ZZK
 *
 */
@Component
public class PrimaryKeyRedisUtil {

	@Resource
	private RedisTemplate<String, Object> redisTemplate;

	public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
		this.redisTemplate = redisTemplate;
	}

	private static Logger logger = LoggerFactory.getLogger(PrimaryKeyRedisUtil.class);

	private static SimpleDateFormat idDateSdf = new SimpleDateFormat("yyMMddHHmmss");
	private static SimpleDateFormat dateSdf = new SimpleDateFormat("yyyyMMdd");
	private static SimpleDateFormat dateTimeSdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");

	/**
	 * 获取主键ID 非事务中运行
	 * 
	 * @param code
	 * @return
	 */
	public String getId(String code) {
		Long idValue;
		try {
			idValue = getIncrement();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			logger.error("错误原因：【" + e.getMessage() + "】 出错堆栈跟踪：" + Arrays.toString(e.getStackTrace()));
			return null;
		}
		String incrValue = StringUtils.addString(String.valueOf(idValue), "0", 6, "L");
		String dateStr = getDate();
		return dateStr + code + incrValue;
	}

	/**
	 * 获取报文序号 非事务运行
	 * 
	 * @return
	 */
	public Long getMsgId() {
		Long idValue;
		try {
			idValue = getMsgIdIncrement();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			logger.error("错误原因：【" + e.getMessage() + "】 出错堆栈跟踪：" + Arrays.toString(e.getStackTrace()));
			return null;
		}
		// String incrValue = StringUtils.addString(String.valueOf(idValue), "0", 8,
		// "L");

		return idValue;
	}

	/**
	 * 获取任务编号 非事务中运行
	 * 
	 * @return
	 */
	public String getTaskNo() {
		Long idValue;
		try {
			idValue = getTaskNoIncrement();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			logger.error("错误原因：【" + e.getMessage() + "】 出错堆栈跟踪：" + Arrays.toString(e.getStackTrace()));
			return null;
		}
		String incrValue = StringUtils.addString(String.valueOf(idValue), "0", 8, "L");

		return incrValue;
	}

	public Long getIncrementValue() {
		// TODO Auto-generated method stub
		try {
			return getIncrement();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			logger.error("错误原因：【" + e.getMessage() + "】 出错堆栈跟踪：" + Arrays.toString(e.getStackTrace()));
			return 0L;
		}
	}

	/**
	 * 
	 * 
	 * @return
	 * @throws ParseException
	 */
	private Long getIncrement() throws ParseException {
		// try {
		BoundValueOperations<String, Object> op = redisTemplate.boundValueOps("Increment_ID");

		Long value = op.increment(1); // 据测试，此方法是线程安全的

		// 若value==1，表明此值是重新开始设定的
		if (value == 1) {
			// 设置缓存过期时间
			Date date = dateTimeSdf.parse(dateSdf.format(new Date()) + " " + "23:59:59"); // 当前的日期加上23:59:59
			op.expireAt(date);
		} else if (value == 999999) {
			redisTemplate.delete("Increment_ID"); // 删除此属性，以至于下次重新生成
		}

		return value;

//		} finally { // 释放连接
//			RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory());
//		}
	}

	private String getDate() {
		String value = idDateSdf.format(new Date());
		// value=value.substring(2, value.length());
		return value;
	}

	public void resetIncrementValue() {
		// try {
		// TODO Auto-generated method stub
		// BoundValueOperations<String, Object> op =
		// redisTemplate.boundValueOps("Increment_ID");
		redisTemplate.delete("Increment_ID");
//		} finally { // 释放连接
//			RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory());
//		}
	}

	/**
	 * 获取包序号值
	 * 
	 * @return
	 * @throws ParseException
	 */
	private Long getMsgIdIncrement() throws ParseException {
		// try {
		BoundValueOperations<String, Object> op = redisTemplate.boundValueOps("Increment_MsgId");

		Long value = op.increment(1); // 据测试，此方法是线程安全的

		// 若value==1，表明此值是重新开始设定的
		if (value == 1) {
			// 设置缓存过期时间
			Date date = dateTimeSdf.parse(dateSdf.format(new Date()) + " " + "23:59:59"); // 当前的日期加上23:59:59
			op.expireAt(date);
		} else if (value == 99999999) {
			redisTemplate.delete("Increment_MsgId"); // 删除此属性，以至于下次重新生成
		}

		return value;
//		} finally { // 释放连接
//			RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory());
//		}
	}

	/**
	 * 获取任务编号（8位字符串）
	 * 
	 * @return
	 * @throws ParseException
	 */
	private Long getTaskNoIncrement() throws ParseException {
		// try {
		BoundValueOperations<String, Object> op = redisTemplate.boundValueOps("Increment_TaskNo");

		Long value = op.increment(1); // 据测试，此方法是线程安全的

		// 若value==1，表明此值是重新开始设定的
		if (value == 1) {
			// 设置缓存过期时间
			Date date = dateTimeSdf.parse(dateSdf.format(new Date()) + " " + "23:59:59"); // 当前的日期加上23:59:59
			op.expireAt(date);
		} else if (value == 99999999) {
			redisTemplate.delete("Increment_TaskNo"); // 删除此属性，以至于下次重新生成
		}

		return value;
//		} finally { // 释放连接
//			RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory());
//		}
	}

}
